学习目标:
了解
正向代理和反向代理
应用
nginx
反向代理实践
应用
nginx
负载均衡实践
应用
nginx
日志定制实践
2.2.1
反向代理
代理是什么?
简单来说,我找一个中间人,代替我去做一件事情,只要他给我结果就可以。
代理一般分为两种:正向代理、反向代理
正向代理
&
反向代理
示意图
区别
从用途上来讲:
正向代理-为局域网客户端向外访问Internet服务。可以使用缓冲特性减少网络使用率。
反向代理-为局域网服务器向外提供Internet服务。可以使用负载平衡提高客户访问量。还可以基于高级URL策略和管理技术对服务进行高质量管控。
从安全性来讲:
正向代理-必须采取安全措施确保内网客户端通过它访问外部网站。隐藏客户端的身份
反向代理-对外提供服务是透明的,客户端并不知道自己访问的是一个代理。隐藏服务端的身份
nginx
代理模块
官方介绍
官方的代理属性很多,我们主要介绍
proxy_pass
和
proxy_set_header
属性
官方代码示例
location / {
: proxy_pass http://localhost:8000; # 设定请求跳转后的地址,可以使用hostname或IP:Port形式
: proxy_set_header X-Real-IP $remote_addr; # 后端请求携带原始请求的真实IP地址
}
属性详解:
proxy_pass
指令设置被代理服务器的地址和被映射的
URI
,地址可以使用主机名或
IP
加端口号的形式
proxy_pass
关键点
proxy_pass
后面的路径最后的
/
作用很重要
!!!
示例代码:
location /html/ {
1 proxy_pass http://proxy.com;
2 proxy_pass http://proxy.com/;
}
对于 1 来说 proxy.com后面没有"/",表示"/html/" 请求(包括自己)后续的路径及其参数等关键字都由http://a.com/来处理,代理后的样式如下:
http://proxy.com/html/test.js
对于 2 来所 proxy.com后面有"/",表示"/html/" 请求后续的路径及其参数等关键字都由http://a.com/来处理,代理后的样式如下:
http://proxy.com/test.js
nginx
代理实践
代理的配置文件
~# vim /etc/nginx/conf.d/proxy.conf
server {
listen 192.168.8.14:80;
server_name www.sswang.com;
location / {
proxy_pass http://192.168.8.14:9999/hello/;
}
}
后端服务配置文件
~# vim /etc/nginx/conf.d/hello.conf
server {
listen 192.168.8.14:9999;
location /hello/ {
alias /var/www/html/hello/;
try_files $uri $uri/ =404;
}
}
准备后端服务文件
mkdir -p /var/www/html/hello/
echo '<h1>proxy_backend</h1>' > /var/www/html/hello/index.html
检查
nginx
配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
查看效果
2.2.2
负载均衡
负载均衡是什么?
我们之前使用
proxy_pass
的方式实现了
nginx
代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?
解决方法就是:负载均衡
负载均衡简单说来人多力量大,打群架。
在
nginx
中的负载均衡主要有两种:四层负载
(IP:Port)
、七层负载
(
http://xxx
)
nginx upstream
模块
官方介绍
官方的代理属性很多,我们主要介绍
upstream
和
ip_hash
属性
官方代码示例
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
属性详解:
upstream
主要是定义一个后端服务地址的集合列表,每个后端服务使用一个
server
命令
表示
upstream {}
和
Server {}
两部分内容属于平级关系。
后端服务状态
在
upstream
模块中,可以使用
server
命令指定后端服务器的地址,同时还可以设置后端服务器在负载均衡调度中的状态,常用的状态有以下几种:
down
:
表示当前
server
主机暂时不参与负载均衡。
backup
:后备主机,当所有非
backup
机器出现故障或者繁忙的时候,才会请求
backup
机器。
max_fails
:允许请求的最大失败数,默认为
1
,配合
fail_timeout
一起使用
fail_timeout
:经历
max_fails
次失败后,暂停服务的时间,默认为
10s
。
nginx
负载均衡实践
负载均衡配置文件
~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
server 192.168.8.14:10086;
server 192.168.8.14:10087;
server 192.168.8.14:10088;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backends;
}
}
后端代理配置文件
~# vim /etc/nginx/conf.d/backend.conf
server {
listen 192.168.8.14:10086;
location / {
root /var/www/html/hello/;
try_files $uri $uri/ =404;
}
}
server {
listen 192.168.8.14:10087;
location / {
root /var/www/html/nihao/;
try_files $uri $uri/ =404;
}
}
server {
listen 192.168.8.14:10088;
location / {
root /var/www/html/huanying/;
try_files $uri $uri/ =404;
}
}
准备后端服务文件
mkdir -p /var/www/html/hello/
echo '<h1>backend_hello</h1>' > /var/www/html/hello/index.html
mkdir -p /var/www/html/nihao/
echo '<h1>backend_nihao</h1>' > /var/www/html/nihao/index.html
mkdir -p /var/www/html/huanying/
echo '<h1>backend_huanying</h1>' > /var/www/html/huanying/index.html
检查
nginx
配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
注意:
因为课堂演示配置文件过多,而且重载次数过多,所以推荐每次进行新实践的时候,
pkill nginx
后再来启动,使用新的内存环境。
查看效果
~# for i in {1..100};do curl http://192.168.8.14;done
<h1>backend_hello</h1>
<h1>backend_nihao</h1>
<h1>backend_huanying</h1>
...
<h1>backend_hello</h1>
<h1>backend_nihao</h1>
<h1>backend_huanying</h1>
ip_hash
实践
修改负载均衡配置文件
~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
ip_hash;
server 192.168.8.14:10086 ;
...
}
...
检查
nginx
配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
查看效果
~# for i in {1..100};do curl http://192.168.8.14;done
<h1>backend_huanying</h1>
...
<h1>backend_huanying</h1>
2.2.3
日志解析
日志功能简介
日志简介
Nginx
默认提供了两个日志文件
access.log
和
error.log
,通过
access.log
可以得到用户请求的相关信息;通过
error.log
可以获取某个
web
服务故障或其性能瓶颈等信息。
而且
nginx
的日志支持定制化格式,这样我们就可以根据实际的业务情况更好的高效工作。最常见的场景就是获取客户端的
IP
,记录用户访问量。
基本配置
# cat /etc/nginx/nginx.conf -n
40 access_log /var/log/nginx/access.log;
41 error_log /var/log/nginx/error.log;
注意:
nginx
日志属性设置的完整格式是:
属性名称
access_log
存储位置
/var/log/nginx/access.log
日志格式
位置为空表示使用默认的
combined
日志格式。它是通过
log_format
设置的
默认日志格式
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
注意:
log_format是有一批nginx内置变量组合而成的。
日志样式:
# tail /var/log/nginx/access.log
192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
nginx
常用内置变量
nginx
常用的内置变量主要是用来分析日志中的
http
记录的,我们可以根据内置的变量精确的获取相关的信息
默认变量
$remote_addr 前一台主机的ip地址,不一定是真实的客户端IP
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_referer 可以记录用户是从哪个链接访问过来的
$http_user_agent 用户所使用的代理(一般为浏览器)
其他常用变量
$request_uri 包含请求参数的原始URI,不包含主机名
$uri 不带请求参数的当前URI,不包含主机名
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_x_real_ip 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$args 这个变量等于请求行中的参数,同$query_string
$host 请求主机头字段,否则为服务器名称。
$scheme HTTP方法(如http,https)
$document_uri 与$uri相同
$document_root 当前请求文件配置文件中html的根目录即root值
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成
示例:
例:http://localhost:10086/sswang1/sswang2/test.txt
$host localhost
$server_port 10086
$request_uri /sswang1/sswang2/test.txt
$document_uri /sswang1/sswang2/test.txt
$document_root /var/www/html
$request_filename /var/www/html/sswang1/sswang2/test.txt
自定义日志实践
需求:
基于代理方式访问
app1
应用,日志存放在
/var/logs/nginx/app1/access.log
,要求能从日志中获取客户端的
IP
地址
因为是获取代理前面客户端的真实
IP
,需要
nginx
开启
--with-http_realip_module
功能,使用
nginx -V
来检查,
ubuntu
默认安装的已经开启了该功能。
设置日志格式
~# vim /etc/nginx/nginx.conf
##
# Logging Settings
## 设定日志格式的方法: log_format 格式名称 "日志表现样式"
log_format proxy_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';
使用日志格式:
access_log
日志路径 格式名称
;
~# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
server 192.168.8.14:10086;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backends;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
~# vim /etc/nginx/conf.d/backend.conf
server {
listen 192.168.8.14:10086;
root /var/www/html/app1/;
access_log /var/log/nginx/app1/access.log proxy_format;
real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
real_ip_recursive on;
location / {
try_files $uri $uri/ =404;
}
}